package com.cainiao.dao;

import org.apache.ibatis.executor.statement.StatementHandler;
import org.apache.ibatis.plugin.*;

import java.sql.Statement;
import java.util.Properties;

/**
 * @author shkstart
 * @create 2021-04-23 8:12
 */
//@Intercepts，完成插件签名：告诉MyBatis当前插件用来拦截那个对象的那个方法
@Intercepts({
        @Signature(type = StatementHandler.class, method = "parameterize", args = java.sql.Statement.class)
})
public class MyFirstPlugin implements Interceptor {
    //intercept拦截，拦截目标对象的目标方法的执行
    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        //打印拦截的目标方法
        System.out.println("MyFirstPlugin intercept:拦截方法:" + invocation.getMethod());
        //执行目标方法：只有执行了proceed方法目标方法，给放行了，目标方法才会执行。
        Object proceed = invocation.proceed();
        //返回执行后的返回值
        return proceed;
    }

    /*
     * plugin：
     * 包装目标对象的：包装：为目标对象创建一个代理对象。
     * */
    @Override
    public Object plugin(Object target) {
        //Mybatis将要包装的对象
        System.out.println("MyFirstPlugin plugin:包装的对象是:" + target);
        //我们可以借助Plugin的wrap方法来使用当前类Interceptor包装我们目标对象
        Object wrap = Plugin.wrap(target, this);
        //返回当前target创建的动态代理
        return wrap;
    }

    /*
     * setProperties：
     * 将插件注册的Property属性设置进来
     * */
    @Override
    public void setProperties(Properties properties) {
        System.out.println("插件配置的信息是：" + properties);
    }
}
